home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / util / pack / drdobbscompress.lha / entropy.c < prev    next >
C/C++ Source or Header  |  1992-09-20  |  2KB  |  76 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define LOG(x) 3.32 * log10(x)
  5. #define ENTROPY(x) -(x*LOG(x))
  6.  
  7. FILE *in;
  8. unsigned int table[256];
  9.  
  10. void read_input(void);
  11. double analyze(void);
  12. void usage(void);
  13.  
  14. main (argc, argv)
  15. char **argv;
  16. {
  17.     double result;
  18.     if (argc==1) usage();
  19.     
  20.     in = fopen(*++argv,"r");
  21.     if (!in) printf("\nCouldn't open input file.");
  22.     if (!in) exit(-1);
  23.     
  24.     printf("\n   ** Reading file ... **");
  25.     read_input();
  26.     printf("\n   ** Calculating  ... **\n");
  27.     result = analyze();
  28.     
  29.     printf("\n   The file \"%s\" has zero-order",*argv);
  30.     printf("\n   entropy of %1u.%2u bits per byte.\n",(int)(result),(int)(100*result-100*(int)(result)));
  31.     printf("\n   Approximate shrinkage potential");
  32.     printf("\n   using Huffman techniques : ");
  33.     printf(" %3u%%\n\n\n",(int)(100-(result*100)/8));
  34.     
  35.     fclose(in);
  36.     return(0L);
  37. }
  38.  
  39. void read_input()
  40. {
  41.     int ch;
  42.     
  43.     while ((ch=getc(in)) != EOF)
  44.         table[ch]++;
  45. }
  46.  
  47. double analyze()
  48. {
  49.     double accum = 0.0;
  50.     double freq;
  51.     long fsize = 0L;
  52.     register int z;
  53.     
  54.     fsize = ftell(in);
  55.     for (z=0; z<256; z++)
  56.         if (table[z])
  57.         {
  58.             freq = (double) table[z]/fsize;
  59.             accum += (double) ENTROPY(freq);
  60.         }
  61.     return accum;
  62. }
  63.  
  64. void usage()
  65. {
  66.     printf("\n\n");
  67.     printf("        Entropy v1.00 by Kas Thomas. Public Domain.\n\n");
  68.     printf("        Syntax:   ENTROPY   {filename}   [Enter]\n\n");
  69.     printf("        Entropy is a measure of information storage efficiency.\n");
  70.     printf("        This program calculates a file's entropy, hence its\n");
  71.     printf("        compressibility, using the entropy equation of Shannon.\n");
  72.     printf("        (see \"Information Theory : Symbols, Signals, & Noise,\"\n");
  73.     printf("        by John Pierce, Dover, 1981).\n\n");
  74.     exit(0L);
  75. }
  76.